package rank

import (
	"common"
	"common/biz"
	"context"
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/redis/go-redis/v9"
)

// 初始化Redis客户端
var ctx = context.Background()
var rdb = redis.NewClient(&redis.Options{
	Addr: "localhost:6379", // Redis服务地址
	DB:   0,                // 使用默认的数据库
})

type reqRank struct {
	Name  string
	score float64
}

type rank struct {
}

func NewRank() *rank {
	return &rank{}
}

func (r *rank) Add(ctx *gin.Context) {
	//接收参数
	var req reqRank
	err2 := ctx.ShouldBindJSON(&req)
	if err2 != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	err := AddScore(req.Name, req.score)
	if err != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	common.Success(ctx, 1) //0失败 1成功
}

func (r *rank) Del(ctx *gin.Context) {
	//接收参数
	var req reqRank
	err2 := ctx.ShouldBindJSON(&req)
	if err2 != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	err := DeleteScore(req.Name)
	if err != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	common.Success(ctx, 1) //0失败 1成功
}

func (r *rank) Update(ctx *gin.Context) {
	//接收参数
	var req reqRank
	err2 := ctx.ShouldBindJSON(&req)
	if err2 != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	err := UpdateScore(req.Name, req.score)
	if err != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	common.Success(ctx, 1) //0失败 1成功
}
func (r *rank) List(ctx *gin.Context) {
	//接收参数
	var i1, i2 int64
	i1, i2 = 1, 2

	st1, err := GetUsersInRange(i1, i2)
	if err != nil {
		common.Fail(ctx, biz.RequestDataError)
		return
	}
	fmt.Println(st1)
	common.Success(ctx, 1) //0失败 1成功
}

// AddScore 新增某个用户的排行榜分数
func AddScore(userName string, score float64) error {
	timestamp := float64(time.Now().UnixNano()) / 1e9
	finalScore := score + timestamp/1e10
	return rdb.ZAdd(ctx, "leaderboard", redis.Z{
		finalScore,
		userName,
	}).Err()
}

// UpdateScore 更新用户的排行榜分数
func UpdateScore(userName string, newScore float64) error {
	// 删除旧分数
	if err := DeleteScore(userName); err != nil {
		return err
	}
	// 新增新分数
	return AddScore(userName, newScore)
}

// DeleteScore 删除某个用户的排行榜分数
func DeleteScore(userName string) error {
	return rdb.ZRem(ctx, "leaderboard", userName).Err()
}

// GetUsersInRange 获取一个排名范围的用户
func GetUsersInRange(start, stop int64) ([]string, error) {
	users, err := rdb.ZRange(ctx, "leaderboard", start, stop).Result()
	if err != nil {
		return nil, err
	}
	return users, nil
}

// 测试案例
func main() {

	// 新增用户分数
	if err := AddScore("Alice", 100.5); err != nil {
		fmt.Println("Error adding score:", err)
	}

	if err := AddScore("Bob", 99.9); err != nil {
		fmt.Println("Error adding score:", err)
	}

	// 更新用户分数
	if err := UpdateScore("Alice", 101.0); err != nil {
		fmt.Println("Error updating score:", err)
	}

	// 获取排名范围内的用户
	users, err := GetUsersInRange(0, -1)
	if err != nil {
		fmt.Println("Error getting users in range:", err)
	} else {
		fmt.Println("Users in range:", users)
	}

	// 删除用户分数
	if err := DeleteScore("Bob"); err != nil {
		fmt.Println("Error deleting score:", err)
	}

}
